package com.github.kazuki43zoo.api.error; import org.springframework.context.MessageSource; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.context.request.WebRequest; import org.terasoluna.gfw.common.message.ResultMessage; import org.terasoluna.gfw.common.message.ResultMessages; import javax.inject.Inject; @Component public class ApiErrorCreator { @Inject MessageSource messageSource; public ApiError createApiError(final WebRequest request, final String errorCode, final String defaultErrorMessage, final Object... arguments) { final String localizedMessage = messageSource.getMessage( errorCode, arguments, defaultErrorMessage, request.getLocale()); return new ApiError(errorCode, localizedMessage); } public ApiError createBindingResultApiError(final WebRequest request, final String errorCode, final BindingResult bindingResult, final String defaultErrorMessage) { final ApiError apiError = createApiError(request, errorCode, defaultErrorMessage); for (final FieldError fieldError : bindingResult.getFieldErrors()) { apiError.addDetail(createApiError(request, fieldError, fieldError.getField())); } for (final ObjectError objectError : bindingResult.getGlobalErrors()) { apiError.addDetail(createApiError(request, objectError, objectError.getObjectName())); } return apiError; } private ApiError createApiError(final WebRequest request, final DefaultMessageSourceResolvable messageResolvable, final String target) { final String localizedMessage = messageSource.getMessage(messageResolvable, request.getLocale()); return new ApiError(messageResolvable.getCode(), localizedMessage, target); } public ApiError createResultMessagesApiError(final WebRequest request, final String rootErrorCode, final ResultMessages resultMessages, final String defaultErrorMessage) { final ApiError apiError; if (resultMessages.getList().size() == 1) { final ResultMessage resultMessage = resultMessages.iterator().next(); String errorCode = resultMessage.getCode(); final String errorText = resultMessage.getText(); if (errorCode == null && errorText == null) { errorCode = rootErrorCode; } apiError = createApiError(request, errorCode, errorText, resultMessage.getArgs()); } else { apiError = createApiError(request, rootErrorCode, defaultErrorMessage); for (final ResultMessage resultMessage : resultMessages.getList()) { apiError.addDetail(createApiError(request, resultMessage.getCode(), resultMessage.getText(), resultMessage.getArgs())); } } return apiError; } }